home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 1 / ETO Development Tools 1.iso / Essentials / Developer Essentials Jul 90 / Programming / MPW Dynamo 3.0 / rt.a < prev    next >
Encoding:
Text File  |  1990-03-17  |  20.3 KB  |  1,541 lines  |  [TEXT/MPS ]

  1. *******************************************************
  2. *                        *
  3. * DYNAMO                        *
  4. *                        *
  5. * Apple II 8-bit runtime library routines.        *
  6. * Copyright (C) 1990 Apple Computer.        *
  7. * Version 3.0                    *
  8. *                        *
  9. * Written by Eric Soldan, Apple II DTS        *
  10. *                        *
  11. *******************************************************
  12.  
  13.         include    ':dynamo.includes:sys.equ'
  14.         import    varspace
  15.  
  16. ******************
  17.  
  18.         export    rtreset
  19. rtreset        proc
  20.         export    numtocopy, chrhibiton, chrhibitoff
  21.         export    sign, readendchr, hexpadchr, padhex
  22.         ldy    #255
  23.         sty    numtocopy
  24.         sty    chrhibitoff
  25.         iny
  26.         sty    chrhibiton
  27.         sty    sign
  28.         sty    readendchr
  29.         lda    #'0'
  30.         sta    hexpadchr
  31.         lsr    padhex
  32.         rts
  33. numtocopy    dc.b    255        ;Will be set back to 255 after
  34.                     ;every string copy or append.
  35. chrhibitoff    dc.b    $FF
  36. chrhibiton    dc.b    0
  37. sign        dc.b    0
  38. readendchr    dc.b    0
  39. hexpadchr    dc.b    '0'
  40. padhex        dc.b    0
  41.         endp
  42.  
  43. ***
  44.  
  45.         export    hibitchrs
  46. hibitchrs    PROC
  47.  
  48.         lda    #$80        ;We don't need to set chrhibitoff
  49.         sta    chrhibiton    ;because it will either be a $7F
  50.         rts            ;or $FF, and in either case
  51.         endp            ;chrhibiton will turn it on anyway.
  52.  
  53. ***
  54.  
  55.         export    lowbitchrs
  56. lowbitchrs    PROC
  57.  
  58.         asl    chrhibiton    ;Was a $00 or $80, so this makes it $00.
  59.         lda    #$7F
  60.         sta    chrhibitoff
  61.         rts
  62.         endp
  63.  
  64. ***
  65.  
  66.         export    regchrs
  67. regchrs        PROC
  68.  
  69.         asl    chrhibiton
  70.         lda    #$FF
  71.         sta    chrhibitoff
  72.         rts
  73.         endp
  74.  
  75. ***
  76.  
  77.         export    rtcout
  78. rtcout        proc
  79.  
  80.         stx    @keepx
  81.         and    chrhibitoff
  82.         ora    chrhibiton
  83.         jsr    $FDED
  84.         ldx    @keepx
  85.         rts
  86. @keepx        dc.b    0
  87.         endp
  88.  
  89. ***
  90.  
  91.         export    write
  92. write        proc
  93.         pla
  94.         sta    @getchr+1
  95.         pla
  96.         sta    @getchr+2
  97.         txa
  98.         pha
  99. @loop        inc    @getchr+1
  100.         bne    @getchr
  101.         inc    @getchr+2
  102. @getchr        lda    $2000        ;Address modified.
  103.         beq    @exit
  104.         jsr    rtcout
  105.         jmp    @loop
  106. @exit        pla
  107.         tax
  108.         lda    @getchr+2
  109.         pha
  110.         lda    @getchr+1
  111.         pha
  112.         rts
  113.         endp
  114.  
  115. ***
  116.  
  117.         export    writecr
  118. writecr        proc
  119.         txa
  120.         pha
  121.         lda    #13
  122.         jsr    rtcout
  123.         pla
  124.         tax
  125.         rts
  126.         endp
  127.  
  128. ***
  129.  
  130.         export    wrcstr
  131. wrcstr        proc
  132.         sta    @getchr+1
  133.         sty    @getchr+2
  134.         txa
  135.         pha
  136. @getchr        lda    $2000        ;Address modified.        
  137.         beq    @exit
  138.         jsr    rtcout
  139.         inc    @getchr+1
  140.         bne    @getchr
  141.         inc    @getchr+2
  142.         bne    @getchr        ;Always.
  143. @exit        pla
  144.         tax
  145.         rts
  146.         endp
  147.  
  148. ***
  149. ***
  150. ***
  151.  
  152.         export    signed
  153. signed        proc
  154.         sec
  155.         ror    sign
  156.         rts
  157.         endp
  158.  
  159. ***
  160.  
  161.         export    unsigned
  162. unsigned        proc
  163.         lsr    sign
  164.         rts
  165.         endp
  166.  
  167. ***
  168.  
  169.         export    chngsgn
  170. chngsgn        proc
  171.         lda    varspace,x
  172.         eor    #$FF
  173.         clc
  174.         adc    #1
  175.         sta    varspace,x
  176.         pha
  177.         lda    varspace+1,x
  178.         eor    #$FF
  179.         adc    #0
  180.         sta    varspace+1,x
  181.         tay
  182.         pla
  183.         rts
  184.         endp
  185.  
  186. ***
  187.  
  188.         export    decoutl
  189. decoutl        proc
  190.         import    decout
  191.         ldy    #0
  192.         jmp    decout        ;jmp, instead of beq so we can be a lib.
  193.         endp
  194.  
  195. ***
  196.  
  197.         export    vdecout
  198. vdecout        proc
  199.         export    decout
  200.         lda    varspace+1,x
  201.         tay
  202.         lda    varspace,x
  203.  
  204. decout        sta    @templ
  205.         sty    @temph
  206.         lda    #'0'
  207.         sta    @temp2
  208.         txa
  209.         pha
  210.         bit    sign
  211.         bpl    @pos
  212.         tya
  213.         bpl    @pos
  214.         lda    #'-'
  215.         jsr    rtcout
  216.         lda    @templ
  217.         eor    #$FF
  218.         clc
  219.         adc    #1
  220.         sta    @templ
  221.         lda    @temph
  222.         eor    #$FF
  223.         adc    #0
  224.         sta    @temph
  225. @pos        ldx    #4
  226. @a        lda    #'0'
  227.         sta    @temp
  228. @b        lda    @templ
  229.         sec
  230.         sbc    @decl,x
  231.         tay
  232.         lda    @temph
  233.         sbc    @dech,x
  234.         bcc    @c
  235.         sta    @temph
  236.         sty    @templ
  237.         inc    @temp
  238.         bcs    @b
  239. @c        lda    @temp
  240.         dex
  241.         bmi    @e        ;Last digit -- print no matter what.
  242.         cmp    @temp2
  243.         beq    @a        ;Don't print leading 0's.
  244.         lsr    @temp2        ;Inval leading 0 test.
  245.         jsr    rtcout
  246.         jmp    @a
  247. @e        jsr    rtcout
  248.         pla
  249.         tax
  250.         rts
  251. @decl        dc.b    1
  252.         dc.b    10
  253.         dc.b    100
  254.         dc.b    1000-768
  255.         dc.b    10000-9984
  256. @dech        dc.b    1>>8
  257.         dc.b    10>>8
  258.         dc.b    100>>8
  259.         dc.b    1000>>8
  260.         dc.b    10000>>8
  261. @templ        dc.b    0
  262. @temph        dc.b    0
  263. @temp        dc.b    0
  264. @temp2        dc.b    0
  265.         endp
  266.  
  267. ***
  268.  
  269.         export    hexpad
  270. hexpad        proc
  271.         sta    hexpadchr
  272.         lsr    padhex
  273.         rts
  274.         endp
  275.  
  276. ***
  277.  
  278.         export    hexnopad
  279. hexnopad        proc
  280.         sec
  281.         ror    padhex
  282.         rts
  283.         endp
  284.  
  285. ***
  286.  
  287.         export    hexoutl
  288. hexoutl        proc
  289.         import    hexout
  290.         ldy    #0
  291.         clc
  292.         jmp    hexout+1        ;jmp, instead of beq so we can be a lib.
  293.         endp
  294.  
  295. ***
  296.  
  297.         export    vhexout
  298. vhexout        proc
  299.         export    hexout
  300.         import    hexpadchr
  301.         lda    varspace+1,x
  302.         tay
  303.         lda    varspace,x
  304.  
  305. hexout        sec
  306.         sta    @templ
  307.         txa
  308.         pha
  309.         ldx    #3
  310.         bcs    @aa
  311.         ldx    #1
  312.         ldy    @templ
  313. @aa        sty    @temph
  314.         lda    padhex
  315.         sta    @padhex
  316.         lda    hexpadchr
  317.         sta    @hexpadchr
  318. @loop        lda    #0
  319.         ldy    #4
  320. @a        asl    @templ
  321.         rol    @temph
  322.         rol    a
  323.         dey
  324.         bne    @a
  325.         tay
  326.         bne    @b
  327.         lda    @padhex
  328.         bmi    @nopad
  329.         lda    @hexpadchr
  330.         jsr    rtcout
  331.         jmp    @nopad
  332. @b        jsr    @doone
  333.         lsr    @padhex
  334.         lda    #'0'
  335.         sta    @hexpadchr
  336. @nopad        dex
  337.         bne    @loop
  338.         lda    @temph
  339.         lsr    a
  340.         lsr    a
  341.         lsr    a
  342.         lsr    a
  343.         tay
  344.         pla
  345.         tax
  346. @doone        lda    @hexdigit,y
  347.         jmp    rtcout
  348. @hexdigit    dc.b    '0123456789ABCDEF'
  349. @padhex        dc.b    0
  350. @hexpadchr    dc.b    0
  351. @templ        dc.b    0
  352. @temph        dc.b    0
  353.         endp
  354.  
  355. ***
  356.  
  357.         export    ldyvar
  358. ldyvar        proc
  359.         lda    varspace,y
  360.         pha
  361.         lda    varspace+1,y
  362.         tay
  363.         pla
  364.         rts
  365.         endp
  366.  
  367. ***
  368.  
  369.         export    mulconl
  370. mulconl        proc
  371.         import    mulcon
  372.         ldy    #0
  373.         jmp    mulcon        ;jmp, instead of beq so we can be a lib.
  374.         endp
  375.  
  376. ***
  377.  
  378.         export    mulvar
  379. mulvar        proc
  380.         export    mulcon, mulvall, mulvalh
  381.         import    multiply, setcon
  382.         jsr    ldyvar
  383.  
  384. mulcon        pha
  385.         lda    varspace,x
  386.         sta    mulvall
  387.         lda    varspace+1,x
  388.         sta    mulvalh
  389.         pla
  390.         jsr    multiply
  391.         jmp    setcon
  392. mulvall        dc.b    0
  393. mulvalh        dc.b    0
  394.         endp
  395.  
  396.         export    multiply
  397. multiply        proc
  398.         sta    @templ
  399.         sty    @temph
  400.         lda    #0
  401.         tay
  402. @a        lsr    mulvalh
  403.         ror    mulvall
  404.         bcc    @b
  405.         clc
  406.         adc    @templ
  407.         pha
  408.         tya
  409.         adc    @temph
  410.         tay
  411.         pla
  412. @b        asl    @templ
  413.         rol    @temph
  414.         pha
  415.         lda    mulvalh
  416.         ora    mulvall
  417.         cmp    #1
  418.         pla
  419.         bcs    @a
  420.         rts
  421. @templ        dc.b    0
  422. @temph        dc.b    0
  423.         endp
  424.  
  425.         export    divconl
  426. divconl        proc
  427.         import    divcon
  428.         ldy    #0
  429.         jmp    divcon        ;jmp, instead of beq so we can be a lib.
  430.         endp
  431.  
  432. ***
  433.  
  434.         export    divvar
  435. divvar        proc
  436.         export    divcon
  437.         import    ldyvar
  438.         jsr    ldyvar
  439.  
  440. divcon        sta    @templ
  441.         sty    @temph
  442.         lda    #16
  443.         sta    @temp
  444.         lda    #0
  445.         sta    @temp2
  446.         sta    @temp3
  447. @a        asl    varspace,x
  448.         rol    varspace+1,x
  449.         rol    @temp2
  450.         rol    @temp3
  451.         lda    @temp2
  452.         sec
  453.         sbc    @templ
  454.         sta    @temp4
  455.         lda    @temp3
  456.         sbc    @temph
  457.         bcc    @b
  458.         sta    @temp3
  459.         lda    @temp4
  460.         sta    @temp2
  461.         inc    varspace,x
  462. @b        dec    @temp
  463.         bne    @a
  464.         lda    @temp2
  465.         ldy    @temp3
  466.         rts
  467. @templ        dc.b    0
  468. @temph        dc.b    0
  469. @temp        dc.b    0
  470. @temp2        dc.b    0
  471. @temp3        dc.b    0
  472. @temp4        dc.b    0
  473.         endp
  474.  
  475. ***
  476.  
  477.         export    addvar
  478. addvar        proc
  479.         export    addcon
  480.         import    ldyvar
  481.         jsr    ldyvar
  482.  
  483. addcon        pha
  484.         clc
  485.         adc    varspace,x
  486.         sta    varspace,x
  487.         tya
  488.         adc    varspace+1,x
  489.         sta    varspace+1,x
  490.         pla
  491.         rts
  492.         endp
  493.  
  494. ***
  495.  
  496.         export    addconl
  497. addconl        proc
  498.         ldy    #0
  499.         jmp    addcon        ;jmp, instead of beq so we can be a lib.
  500.         endp
  501.  
  502. ***
  503.  
  504.         export    subvar
  505. subvar        proc
  506.         export    subcon
  507.         import    ldyvar
  508.         jsr    ldyvar
  509.  
  510. subcon        pha
  511.         sta    @temp
  512.         lda    varspace,x
  513.         sec
  514.         sbc    @temp
  515.         sta    varspace,x
  516.         sty    @temp
  517.         lda    varspace+1,x
  518.         sbc    @temp
  519.         sta    varspace+1,x
  520.         pla
  521.         rts
  522. @temp        dc.b    0
  523.         endp
  524.  
  525. ***
  526.  
  527.         export    subconl
  528. subconl        proc
  529.         ldy    #0
  530.         jmp    subcon        ;jmp, instead of beq so we can be a lib.
  531.         endp
  532.  
  533. ***
  534.  
  535.         export    setconl
  536. setconl        proc
  537.         export    setcon
  538.         ldy    #0
  539.  
  540. setcon        sta    varspace,x
  541.         pha
  542.         tya
  543.         sta    varspace+1,x
  544.         pla
  545.         rts
  546.         endp
  547.  
  548. ***
  549.  
  550.         export    setzero
  551. setzero        proc
  552.         lda    #0
  553.         sta    varspace+1,x
  554.         sta    varspace,x
  555.         rts
  556.         endp
  557.  
  558. ***
  559.  
  560.         export    seteq
  561. seteq        proc
  562.         lda    varspace+1,y
  563.         sta    varspace+1,x
  564.         lda    varspace,y
  565.         sta    varspace,x
  566.         rts
  567.         endp
  568.  
  569. ***
  570.  
  571.         export    setvars
  572. setvars        proc
  573.         pla
  574.         sta    @getval+1
  575.         pla
  576.         sta    @getval+2
  577.         txa
  578.         pha
  579.         ldy    #1
  580. @loop        jsr    @getval
  581.         cmp    #255
  582.         beq    @exit
  583.         tax
  584.         jsr    @getval
  585.         sta    varspace,x
  586.         jsr    @getval
  587.         sta    varspace+1,x
  588.         bcc    @loop        ;Always.
  589. @exit        pla
  590.         tax
  591.         lda    @getval+2
  592.         pha
  593.         lda    @getval+1
  594.         pha
  595.         rts
  596. @getval        lda    $2000,y        ;Address modified.
  597.         inc    @getval+1
  598.         bne    @rts
  599.         inc    @getval+2
  600. @rts        rts
  601.         endp
  602.  
  603. ***
  604.  
  605.         export    xgty
  606. xgty        proc
  607.         import    vifequal, vifsgneq, xlty0
  608.         lda    sign
  609.         bpl    @a
  610.         jsr    vifsgneq
  611.         jmp    @b
  612. @a        jsr    vifequal
  613. @b        bcs    @rts
  614.         jmp    xlty0        ;jmp, instead of bcc so we can be a lib.
  615. @rts        rts
  616.         endp
  617.  
  618. ***
  619.  
  620.         export    xlty
  621. xlty        proc
  622.         export    xlty0
  623.         import    vifequal, vifsgneq
  624.         lda    sign
  625.         bpl    @a
  626.         jsr    vifsgneq
  627.         jmp    @b
  628. @a        jsr    vifequal
  629. @b        bcc    xltyrts
  630. xlty0        lda    varspace,x
  631.         pha
  632.         lda    varspace,y
  633.         sta    varspace,x
  634.         pla
  635.         sta    varspace,y
  636.         lda    varspace+1,x
  637.         pha
  638.         lda    varspace+1,y
  639.         sta    varspace+1,x
  640.         pla
  641.         sta    varspace+1,y
  642. xltyrts        rts
  643.         endp
  644.  
  645. ***
  646.  
  647.         export    ifequal
  648. ifequal        proc
  649.         sta    @lo+1
  650.         sty    @hi+1
  651.         lda    varspace+1,x
  652. @hi        cmp    #0        ;Operand modified.
  653.         bne    @exit
  654.         lda    varspace,x
  655. @lo        cmp    #0        ;Operand modified.
  656. @exit        php
  657.         lda    @lo+1
  658.         plp
  659.         rts            ;eq=eq, cs>=, cc<
  660.         endp
  661.  
  662. ***
  663.  
  664.         export    vifequal
  665. vifequal        proc
  666.         sta    @acc+1
  667.         lda    varspace+1,x
  668.         cmp    varspace+1,y
  669.         bne    @exit
  670.         lda    varspace,x
  671.         cmp    varspace,y
  672. @exit        php
  673. @acc        lda    #0        ;Operand modified.
  674.         plp
  675.         rts
  676.         endp
  677.  
  678. ***
  679.  
  680.         export    ifsgneq
  681. ifsgneq        proc
  682.         sta    @acc+1        ;Preserve acc.
  683.         tya
  684.         cmp    #$80        ;Carry set if right side negative.
  685.         eor    varspace+1,x        ;See if signs are the same.
  686.         bmi    @exit        ;Signs are different -- done.
  687.         bcs    @a        ;Variables are negative.
  688.         lda    @acc+1
  689.         jmp    ifequal        ;Variables are positive.
  690. @a        jsr    ifequal
  691.         beq    @rts        ;xreg variable is equal.
  692.         ror    a
  693.         eor    #$80
  694.         sec            ;not equal status.
  695.         rol    a
  696. @exit        php
  697. @acc        lda    #0        ;Operand modified.
  698.         plp
  699. @rts        rts            ;eq=eq, cs>=, cc<
  700.         endp
  701.  
  702. ***
  703.  
  704.         export    vifsgneq
  705. vifsgneq        proc
  706.         sta    @acc+1
  707.         sty    @yreg+1
  708.         lda    varspace,y        ;Load up the variable value and go do it.
  709.         pha
  710.         lda    varspace+1,y
  711.         tay
  712.         pla
  713.         jsr    ifsgneq
  714.         php
  715. @acc        lda    #0        ;Operand modified.
  716. @yreg        ldy    #0        ;Operand modified.
  717.         plp
  718.         rts
  719.         endp
  720.  
  721. ***
  722.  
  723.         export    seedrandom
  724. seedrandom    proc
  725.         export    randomval
  726.         adc    $C02E        ;Video counter.
  727.         pha
  728.         tya
  729.         adc    $C02E
  730.         tay
  731.         bne    @a
  732.         iny
  733. @a        pla
  734.         bne    @b
  735.         adc    #1
  736. @b        sta    randomval
  737.         sty    randomval+1
  738.         rts
  739. randomval    dc.w    0
  740.         endp
  741.  
  742. ***
  743.  
  744.         export    calcrandom
  745. calcrandom    proc
  746.         stx    @keepx        ;Keep this so we can restore the xreg.
  747.  
  748.         tax            ;Use 1 less than limit, so that we can
  749.         bne    @a        ;compute the smallest mask possible.  This
  750.         dey            ;way, if we are passed $100, we won't
  751. @a        dex            ;compute a mask of $1FF.
  752.         stx    @rndlimit    ;The carry was set by cmp #0, so the 
  753.         sty    @rndlimit+1    ;sbc #1 is okay.
  754.  
  755. * Figure a mask that is larger than or equal to the rndlimit (minus 1).  This will be
  756. * used against the calculated randomval before it is compared to the rndlimit.  If the
  757. * randomval is still too large, then we will get another.
  758.         ldx    #0
  759.         lda    @rndlimit+1
  760.         beq    @c        ;No hi-byte, so work on low-byte.
  761.         txa
  762.         inx
  763. @c        sec
  764.         rol    a
  765.         cmp    @rndlimit,x
  766.         bcc    @c
  767.         sta    @maskl,x
  768.         txa
  769.         eor    #1
  770.         tax
  771.         sbc    #1        ;Carry set.
  772.         sta    @maskl,x
  773.  
  774. @recalc        ldy    #19
  775. @d        asl    randomval
  776.         rol    randomval+1
  777.         bcc    @e
  778.         lda    randomval
  779.         eor    #$87
  780.         sta    randomval
  781.         lda    randomval+1
  782.         eor    #$1D
  783.         sta    randomval+1
  784. @e        dey
  785.         bne    @d
  786.  
  787.         ldy    randomval+1
  788.         ldx    randomval
  789.         bne    @f
  790.         dey
  791. @f        dex
  792.         tya
  793.         and    @maskh
  794.         tay
  795.         txa
  796.         and    @maskl
  797.         cpy    @rndlimit+1
  798.         bcc    @g
  799.         bne    @recalc
  800.         cmp    @rndlimit
  801.         bcc    @g
  802.         bne    @recalc
  803. @g        ldx    @keepx
  804.         rts
  805. @rndlimit    dc.w    0
  806. @keepx        dc.b    0
  807. @maskl        dc.b    0
  808. @maskh        dc.b    0
  809.         endp
  810.  
  811. ***
  812. ***
  813. ***
  814.  
  815.         export    strval
  816. strval        proc
  817.         export    midstrval
  818.         import    strinfo, strsign, strvalcount, strvaldigit, strlen, currentstr, nextchr
  819.         ldy    #0
  820. midstrval    jsr    strinfo
  821.         sta    @getchr+1
  822.         stx    @getchr+2
  823.         lda    #0
  824.         sta    strsign
  825.         sta    strvalcount
  826.         sta    strvaldigit
  827.         sta    @temp
  828.         sta    @temp2
  829. @sign        cpy    strlen
  830.         bcs    @exit        ;Indexed out of string at start.
  831.         jsr    @getchr        ;Decimal or hex...
  832.         cmp    #'-'        ;Find out if there is an even or odd # of -'s.
  833.         bne    @pos
  834.         inc    strsign
  835.         iny
  836.         inc    strvalcount
  837.         bcs    @sign        ;Always.
  838. @pos        cmp    #'$'
  839.         beq    @hex
  840. @a        cmp    #'0'
  841.         bcc    @exit        ;Not an int char, so we are done.
  842.         cmp    #'9'+1
  843.         bcs    @exit        ;Not an int char, so we are done.
  844.         iny
  845.         inc    strvalcount
  846.         inc    strvaldigit
  847.         sbc    #47        ;cclear
  848.         pha
  849.         ldx    @temp2        ;Multiply by 10.
  850.         lda    @temp
  851.         asl    a
  852.         rol    @temp2
  853.         asl    a
  854.         rol    @temp2
  855.         adc    @temp
  856.         sta    @temp
  857.         txa
  858.         adc    @temp2
  859.         asl    @temp
  860.         rol    a
  861.         sta    @temp2
  862.         pla
  863.         adc    @temp
  864.         sta    @temp
  865.         bcc    @b
  866.         inc    @temp2
  867. @b        cpy    strlen        ;See if we have more characters to look at.
  868.         bcs    @exit        ;No more characters to look at.
  869.         jsr    @getchr        ;Get the next character.
  870.         bcc    @a        ;Always.
  871. @exit        sty    nextchr        ;Save next character location.
  872.         ldx    currentstr
  873.         lda    @temp        ;Return value in acc,yreg.
  874.         ldy    @temp2
  875.         ror    strsign        ;Should be negative.
  876.         bcc    @rts
  877.         eor    #$FF
  878.         adc    #0        ;cset
  879.         pha
  880.         tya
  881.         eor    #$FF
  882.         adc    #0
  883.         tay
  884.         pla
  885. @rts        rts
  886. @getchr        lda    $2000,y        ;Address modified.
  887.         rts
  888. @hex        iny
  889.         inc    strvalcount
  890.         cpy    strlen
  891.         bcs    @exit
  892.         jsr    @getchr
  893.         cmp    #'0'
  894.         bcc    @exit
  895.         cmp    #'9'+1
  896.         bcc    @hexdigit
  897.         and    #$5F
  898.         cmp    #'A'
  899.         bcc    @exit
  900.         cmp    #'Z'+1
  901.         bcs    @exit
  902.         sbc    #6        ;Carry clear.
  903. @hexdigit    inc    strvaldigit
  904.         asl    @temp
  905.         rol    @temp2
  906.         asl    @temp
  907.         rol    @temp2
  908.         asl    @temp
  909.         rol    @temp2
  910.         asl    @temp
  911.         rol    @temp2
  912.         and    #$0F
  913.         ora    @temp
  914.         sta    @temp
  915.         jmp    @hex
  916. @temp        dc.b    0
  917. @temp2        dc.b    0
  918.         endp
  919.  
  920. ***
  921.  
  922.  
  923.         export    strinfo
  924. strinfo        proc
  925.         export    currentstr, strlen, maxstrlen, numchrs
  926.         export    strsign, strvalcount, strvaldigit, nextchr
  927.         import    strlens, maxstrlens, strlocs, numtocopy
  928.         stx    currentstr
  929.         lda    strlens,x    ;String number in xreg.
  930.         sta    strlen
  931.         lda    maxstrlens,x
  932.         sta    maxstrlen
  933.         txa
  934.         asl    a
  935.         tax
  936.         bcs    @a
  937.         lda    strlocs,x
  938.         pha
  939.         lda    strlocs+1,x
  940.         tax
  941.         pla
  942.         rts
  943. @a        lda    strlocs+$100,x
  944.         pha
  945.         lda    strlocs+$101,x
  946.         tax
  947.         pla
  948.         rts
  949. currentstr    dc.b    0
  950. strlen        dc.b    0
  951. maxstrlen    dc.b    0
  952. numchrs        dc.b    0
  953. strsign        dc.b    0
  954. strvalcount    dc.b    0
  955. strvaldigit    dc.b    0
  956. nextchr        dc.b    0
  957.         endp
  958.  
  959. ***
  960.  
  961.         export    prstr
  962. prstr        proc
  963.         lda    #255        ;xreg=str -- write entire string.
  964.         export    prleftstr, prmidstr
  965.  
  966. prleftstr    ldy    #0        ;xreg=str, acc=numChrs
  967.  
  968. prmidstr        cmp    #0
  969.         beq    @exit
  970.         sta    numchrs        ;xreg=str, acc=numChrs, yreg=starting chr.
  971.         jsr    strinfo
  972.         sta    @getchr+1
  973.         stx    @getchr+2
  974. @loop        cpy    strlen
  975.         bcs    @exit
  976.         tya
  977.         pha
  978. @getchr        lda    $2000,y        ;Address modified.
  979.         jsr    rtcout
  980.         pla
  981.         tay
  982.         iny
  983.         dec    numchrs
  984.         bne    @loop
  985. @exit        ldx    currentstr
  986.         rts
  987.         endp
  988.  
  989. ***
  990.  
  991.         export    leftstrcpy
  992. leftstrcpy    proc
  993.         export    strcpy, midstrcpy
  994.         import    numtocopy, copystr
  995.         sta    numtocopy    ;Number to copy in acc.
  996.  
  997. strcpy        lda    #0        ;Copy entire string.
  998.  
  999. midstrcpy    clc            ;String offset in acc.
  1000.         jmp    copystr        ;jmp, instead of bcc so we can be a lib.
  1001.         endp
  1002.  
  1003. ***
  1004.  
  1005.         export    leftstrcat
  1006. leftstrcat    proc
  1007.         export    strcat, midstrcat, copystr
  1008.         import    strlens, strlocs
  1009.         sta    numtocopy    ;Number to append in acc.
  1010.  
  1011. strcat        lda    #0        ;Append entire string.
  1012.  
  1013. midstrcat    sec            ;String offset in acc.
  1014.  
  1015. copystr        pha            ;Keep source offset.
  1016.         php            ;Keep copy or append status.
  1017.         jsr    strinfo
  1018.         sta    @dst+1
  1019.         stx    @dst+2
  1020.         lda    strlens,y
  1021.         sta    @srcstrlen
  1022.         tya
  1023.         asl    a
  1024.         tay
  1025.         bcs    @a
  1026.         lda    strlocs,y
  1027.         sta    @src+1
  1028.         lda    strlocs+1,y
  1029.         sta    @src+2
  1030.         bcc    @b
  1031. @a        lda    strlocs+$100,y
  1032.         sta    @src+1
  1033.         lda    strlocs+$101,y
  1034.         sta    @src+2
  1035. @b        ldx    #0
  1036.         plp            ;Get copy or append status.
  1037.         bcc    @c        ;Copy status.
  1038.         ldx    strlen        ;Append status.
  1039. @c        pla
  1040.         tay            ;Source offset.
  1041. @loop        cpy    @srcstrlen
  1042.         bcs    @exit
  1043.         cpx    maxstrlen
  1044.         bcs    @exit
  1045. @src        lda    $2000,y        ;Address modified.
  1046. @dst        sta    $2000,x        ;Address modified.
  1047.         inx
  1048.         iny
  1049.         dec    numtocopy
  1050.         bne    @loop
  1051. @exit        lda    #255        ;Set it back for next midstr operation.
  1052.         sta    numtocopy    ;The next one may only have 3 parameters.
  1053.         txa            ;xreg has destination string length.
  1054.         ldx    currentstr
  1055.         sta    strlens,x
  1056.         rts
  1057. @srcstrlen    dc.b    0
  1058.         endp
  1059.  
  1060. ***
  1061.  
  1062.         export    litstr
  1063. litstr        proc
  1064.         import    strlens
  1065.         pla
  1066.         sta    @getchr+1
  1067.         pla
  1068.         sta    @getchr+2
  1069.         jsr    strinfo
  1070.         sta    @putchr+1
  1071.         stx    @putchr+2
  1072.         ldy    #0
  1073. @loop        inc    @getchr+1
  1074.         bne    @getchr
  1075.         inc    @getchr+2
  1076. @getchr        lda    $2000        ;Address modified.
  1077.         beq    @exit
  1078.         cpy    maxstrlen
  1079.         bcs    @loop
  1080. @putchr        sta    $2000,y
  1081.         iny
  1082.         bne    @loop
  1083. @exit        lda    @getchr+2
  1084.         pha
  1085.         lda    @getchr+1
  1086.         pha
  1087.         ldx    currentstr
  1088.         tya
  1089.         sta    strlens,x
  1090.         rts
  1091.         endp
  1092.  
  1093. ***
  1094.  
  1095.         export    strchr
  1096. strchr        proc
  1097.         tay
  1098.         jsr    strinfo
  1099.         sta    @getchr+1
  1100.         stx    @getchr+2
  1101. @getchr        lda    $2000,y
  1102.         ldx    currentstr
  1103.         rts
  1104.         endp
  1105.  
  1106. ***
  1107.  
  1108.         export    strloc
  1109. strloc        proc
  1110.         jsr    strinfo
  1111.         pha
  1112.         txa
  1113.         tay
  1114.         ldx    currentstr
  1115.         pla
  1116.         rts
  1117.         endp
  1118.  
  1119. ***
  1120. ***
  1121. ***
  1122.  
  1123.         export    restore
  1124. restore        proc
  1125.         import    getdatabyte
  1126.         sta    getdatabyte+1
  1127.         sty    getdatabyte+2
  1128.         rts
  1129.         endp
  1130.  
  1131. ***
  1132.  
  1133.         export    getdatabyte
  1134. getdatabyte    proc
  1135.         lda    $2000
  1136.         inc    getdatabyte+1
  1137.         bne    @rts
  1138.         inc    getdatabyte+2
  1139. @rts        rts
  1140.         endp
  1141.  
  1142. ***
  1143.  
  1144.         export    readint
  1145. readint        proc
  1146.         jsr    getdatabyte
  1147.         sta    varspace,x
  1148.         pha
  1149.         jsr    getdatabyte
  1150.         sta    varspace+1,x
  1151.         tay
  1152.         pla
  1153.         rts
  1154.         endp
  1155.  
  1156. ***
  1157.  
  1158.         export    readstr
  1159. readstr        proc
  1160.         import    strlens
  1161.         jsr    strinfo
  1162.         sta    @putchr+1
  1163.         stx    @putchr+2
  1164.         ldy    #0
  1165. @loop        jsr    getdatabyte
  1166.         cmp    readendchr
  1167.         beq    @exit
  1168.         cpy    maxstrlen
  1169.         bcs    @loop
  1170. @putchr        sta    $2000,y
  1171.         iny
  1172.         bne    @loop
  1173. @exit        ldx    currentstr
  1174.         tya
  1175.         sta    strlens,x
  1176.         rts
  1177.         endp
  1178.  
  1179. ***
  1180.  
  1181.         export    readend
  1182. readend        proc
  1183.         sta    readendchr
  1184.         rts
  1185.         endp
  1186.  
  1187. ***
  1188. ***
  1189. ***
  1190.  
  1191.         export    arraybase
  1192. arraybase    proc
  1193.         export    arrayloc1, arrayloc2, arrayloc3
  1194.         export    arrayloc0l, arrayloc0h
  1195.         export    arrayloc1l, arrayloc1h
  1196.         export    arrayloc2l, arrayloc2h
  1197.         export    arrayloc3l, arrayloc3h
  1198.         sta    arrayloc0l
  1199.         sty    arrayloc0h
  1200. arrayloc1    sta    arrayloc1l
  1201.         sty    arrayloc1h
  1202. arrayloc2    sta    arrayloc2l
  1203.         sty    arrayloc2h
  1204. arrayloc3    sta    arrayloc3l
  1205.         sty    arrayloc3h
  1206.         sta    aptr
  1207.         sty    aptr+1
  1208.         rts
  1209. arrayloc0l    dc.b    0
  1210. arrayloc0h    dc.b    0
  1211. arrayloc1l    dc.b    0
  1212. arrayloc1h    dc.b    0
  1213. arrayloc2l    dc.b    0
  1214. arrayloc2h    dc.b    0
  1215. arrayloc3l    dc.b    0
  1216. arrayloc3h    dc.b    0
  1217.         endp
  1218.  
  1219. ***
  1220.  
  1221.         export    dim1size
  1222. dim1size        proc
  1223.         export    dim2size, dim3size
  1224.         export    dim1sizel, dim1sizeh
  1225.         export    dim2sizel, dim2sizeh
  1226.         export    dim3sizel, dim3sizeh
  1227.         sta    dim1sizel
  1228.         sty    dim1sizeh
  1229. dim2size        sta    dim2sizel
  1230.         sty    dim2sizeh
  1231. dim3size        sta    dim3sizel
  1232.         sty    dim3sizeh
  1233.         rts
  1234. dim1sizel    dc.b    0
  1235. dim1sizeh    dc.b    0
  1236. dim2sizel    dc.b    0
  1237. dim2sizeh    dc.b    0
  1238. dim3sizel    dc.b    0
  1239. dim3sizeh    dc.b    0
  1240.         endp
  1241.  
  1242. ***
  1243.  
  1244.         export    varyindx1
  1245. varyindx1    proc
  1246.         export    arrayindx1, arraylindx1
  1247.         lda    varspace,y
  1248.         pha
  1249.         lda    varspace+1,y
  1250.         tay
  1251.         pla
  1252.  
  1253. arrayindx1    sta    mulvall
  1254.         sty    mulvalh
  1255.         lda    dim1sizel
  1256.         ldy    dim1sizeh
  1257.         jsr    multiply
  1258.         clc
  1259.         adc    arrayloc0l
  1260.         pha
  1261.         tya
  1262.         adc    arrayloc0h
  1263.         tay
  1264.         pla
  1265.         jmp    arrayloc1
  1266. arraylindx1    ldy    #0        ;Low-byte-only index entry point.
  1267.         beq    arrayindx1
  1268.         endp
  1269.  
  1270. ***
  1271.  
  1272.         export    varyindx2
  1273. varyindx2    proc
  1274.         export    arrayindx2, arraylindx2
  1275.         lda    varspace,y
  1276.         pha
  1277.         lda    varspace+1,y
  1278.         tay
  1279.         pla
  1280.  
  1281. arrayindx2    sta    mulvall
  1282.         sty    mulvalh
  1283.         lda    dim2sizel
  1284.         ldy    dim2sizeh
  1285.         jsr    multiply
  1286.         clc
  1287.         adc    arrayloc1l
  1288.         pha
  1289.         tya
  1290.         adc    arrayloc1h
  1291.         tay
  1292.         pla
  1293.         jmp    arrayloc2
  1294. arraylindx2    ldy    #0        ;Low-byte-only index entry point.
  1295.         beq    arrayindx2
  1296.         endp
  1297.  
  1298. ***
  1299.  
  1300.         export    varyindx3
  1301. varyindx3    proc
  1302.         export    arrayindx3, arraylindx3
  1303.         lda    varspace,y
  1304.         pha
  1305.         lda    varspace+1,y
  1306.         tay
  1307.         pla
  1308.  
  1309. arrayindx3    sta    mulvall
  1310.         sty    mulvalh
  1311.         lda    dim3sizel
  1312.         ldy    dim3sizeh
  1313.         jsr    multiply
  1314.         clc
  1315.         adc    arrayloc2l
  1316.         pha
  1317.         tya
  1318.         adc    arrayloc2h
  1319.         tay
  1320.         pla
  1321.         jmp    arrayloc3
  1322. arraylindx3    ldy    #0        ;Low-byte-only index entry point.
  1323.         beq    arrayindx3
  1324.         endp
  1325.  
  1326. ***
  1327.  
  1328.         export    vgetbyte
  1329. vgetbyte        proc
  1330.         export    getbyte, getnextbyte, getbytel
  1331.         lda    varspace,y
  1332.         pha
  1333.         lda    varspace+1,y
  1334.         tay
  1335.         pla
  1336.  
  1337. getbyte        clc
  1338.         adc    arrayloc3l
  1339.         sta    aptr
  1340.         tya
  1341.         adc    arrayloc3h
  1342.         sta    aptr+1
  1343. getnextbyte    ldy    #0
  1344.         tya
  1345.         sta    varspace+1,x
  1346.         lda    (aptr),y
  1347.         sta    varspace,x
  1348.         inc    aptr
  1349.         bne    @a
  1350.         inc    aptr+1
  1351. @a        rts
  1352. getbytel        ldy    #0
  1353.         beq    getbyte
  1354.         endp
  1355.  
  1356. ***
  1357.  
  1358.         export    vgetword
  1359. vgetword        proc
  1360.         export    getword, getnextword, getwordl
  1361.         lda    varspace,y
  1362.         pha
  1363.         lda    varspace+1,y
  1364.         tay
  1365.         pla
  1366.  
  1367. getword        asl    a
  1368.         bcc    @a
  1369.         iny
  1370. @a        clc
  1371.         adc    arrayloc3l
  1372.         sta    aptr
  1373.         tya
  1374.         adc    arrayloc3h
  1375.         sta    aptr+1
  1376. getnextword    ldy    #0
  1377.         lda    (aptr),y
  1378.         sta    varspace,x
  1379.         inc    aptr
  1380.         bne    @b
  1381.         inc    aptr+1
  1382. @b        lda    (aptr),y
  1383.         sta    varspace+1,x
  1384.         inc    aptr
  1385.         bne    @c
  1386.         inc    aptr+1
  1387. @c        tay
  1388.         lda    varspace,x
  1389.         rts
  1390. getwordl        ldy    #0
  1391.         beq    getword
  1392.         endp
  1393.  
  1394. ***
  1395.  
  1396.         export    vputbyte
  1397. vputbyte        proc
  1398.         export    putbyte, putnextbyte, putbytel
  1399.         lda    varspace,y
  1400.         pha
  1401.         lda    varspace+1,y
  1402.         tay
  1403.         pla
  1404.  
  1405. putbyte        clc
  1406.         adc    arrayloc3l
  1407.         sta    aptr
  1408.         tya
  1409.         adc    arrayloc3h
  1410.         sta    aptr+1
  1411. putnextbyte    lda    varspace,x
  1412.         ldy    #0
  1413.         sta    (aptr),y
  1414.         inc    aptr
  1415.         bne    @a
  1416.         inc    aptr+1
  1417. @a        rts
  1418. putbytel        ldy    #0
  1419.         beq    putbyte
  1420.         endp
  1421.  
  1422. ***
  1423.  
  1424.         export    vputword
  1425. vputword        proc
  1426.         export    putword, putnextword, putwordl
  1427.         lda    varspace,y
  1428.         pha
  1429.         lda    varspace+1,y
  1430.         tay
  1431.         pla
  1432.  
  1433. putword        asl    a
  1434.         bcc    @a
  1435.         iny
  1436. @a        clc
  1437.         adc    arrayloc3l
  1438.         sta    aptr
  1439.         tya
  1440.         adc    arrayloc3h
  1441.         sta    aptr+1
  1442. putnextword    ldy    #0
  1443.         lda    varspace,x
  1444.         sta    (aptr),y
  1445.         inc    aptr
  1446.         bne    @b
  1447.         inc    aptr+1
  1448. @b        lda    varspace+1,x
  1449.         sta    (aptr),y
  1450.         inc    aptr
  1451.         bne    @c
  1452.         inc    aptr+1
  1453. @c        tay
  1454.         lda    varspace,x
  1455.         rts
  1456. putwordl        ldy    #0
  1457.         beq    putword
  1458.         endp
  1459.  
  1460. ***
  1461.  
  1462.         export    deref
  1463. deref        PROC
  1464.         sta    @getbyte+1
  1465.         sty    @getbyte+2
  1466.         jsr    @getbyte        ;Get low-byte.
  1467.         tya
  1468.         inc    @getbyte+1
  1469.         bne    @getbyte
  1470.         inc    @getbyte+2
  1471. @getbyte        ldy    $2000        ;Address modified.        
  1472.         rts
  1473.  
  1474.         endp
  1475.  
  1476. ***
  1477.  
  1478.         export    aderefz
  1479. aderefz        PROC
  1480.         export    aderef
  1481.         lda    $2000        ;Address modified.
  1482.         inc    aderefz+1
  1483.         bne    @rts
  1484.         inc    aderefz+2
  1485. @rts        rts
  1486. aderef        sta    aderefz+1
  1487.         jsr    aderefz        ;Get low-byte.
  1488.         pha
  1489.         jsr    aderefz
  1490.         sta    aderefz+2
  1491.         pla
  1492.         rts
  1493.  
  1494.         endp
  1495.  
  1496. ***
  1497.  
  1498.         export    yderefz
  1499. yderefz        PROC
  1500.         export    yderef
  1501.         ldy    $2000        ;Address modified.
  1502.         inc    yderefz+1
  1503.         bne    @rts
  1504.         inc    yderefz+2
  1505. @rts        rts
  1506. yderef        sty    yderefz+1
  1507.         jsr    yderefz        ;Get low-byte.
  1508.         sty    @lo
  1509.         jsr    yderefz
  1510.         sty    yderefz+2
  1511.         ldy    @lo
  1512.         rts
  1513. @lo        dc.b    0
  1514.  
  1515.         endp
  1516.  
  1517. ***
  1518.  
  1519.         export    vderef        ;x-reg variable deref.
  1520. vderef        PROC
  1521.         pha
  1522.         lda    varspace,x
  1523.         sta    @getbyte+1
  1524.         lda    varspace+1,x
  1525.         sta    @getbyte+2
  1526.         jsr    @getbyte        ;Get low-byte.
  1527.         sta    varspace,x
  1528.         inc    @getbyte+1
  1529.         bne    @a
  1530.         inc    @getbyte+2
  1531. @a        jsr    @getbyte
  1532.         sta    varspace+1,x
  1533.         pla
  1534.         rts
  1535. @getbyte        lda    $2000        ;Address modified.        
  1536.         rts
  1537.  
  1538.         endp
  1539.  
  1540.         end
  1541.